package com.comment.pojo.domain.logic.core;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.activerecord.Model;

import java.io.Serializable;
import java.util.Map;
import java.util.Set;
import com.baomidou.mybatisplus.extension.handlers.Fastjson2TypeHandler;
import com.fasterxml.jackson.annotation.JsonIgnore;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;

/**
 * 房间表(PvpRoom)表实体类
 *
 * @author cxy
 * @since 2024-11-06 15:30:35
 */
@ApiModel("房间表")
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
@TableName(autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
public class PvpRoom extends Model<PvpRoom> {// swagger2,mybatis-plus
    ///////////////////////////////////////////////////////////////////////////////////////////////////////// 生成实体字段
    @TableId(type = IdType.INPUT)
    @ApiModelProperty("房主")
    private Long roomOwner;

    @ApiModelProperty("房间名")
    private String roomName;

    @ApiModelProperty("地图id")
    private Long mapId;

    @ApiModelProperty("比赛id")
    private Long matchId;

    @ApiModelProperty("游戏类型")
    private Integer gameType;

    @TableField(typeHandler = Fastjson2TypeHandler.class)
    @ApiModelProperty("房间位置")
    public Map<String, Object> roomPos;

    // 返回为空
    @JsonIgnore
    @ApiModelProperty("房间密码")
    private String pwd;

    @TableField(typeHandler = Fastjson2TypeHandler.class)
    @ApiModelProperty("房间玩家")
    public Set<Long> players;

    @ApiModelProperty("房间状态 0:未满员 1:满员 2:游戏中")
    private Integer roomStatus;

    ///////////////////////////////////////////////////////////////////////////////////////////////////////// 序列化版本号
    @TableField(exist = false)
    private static final long serialVersionUID = -97264894602559366L;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////// 获取主键值
    @Override
    public Serializable pkVal() {
        return this.roomOwner;
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////// 非数据库字段
    /////////////////////////////////////////////////////////////////////////////////////////////////////////    领域业务

    /**
     * 检查-房间-是否满员
     */
    public void checkRoomStatus() {
        if (obtainNextEmptySeat() == null) {
            if (roomStatus == 0) {
                setRoomStatus(1);
            }
        }
    }

    /**
     * 获取下个座位的玩家
     *
     * @return 玩家id
     */
    public Long obtainNextPlayer() {
        // 按key小到大排序
        for (int i = 1; i < 8; i++) {
            Object o = roomPos.get(Integer.toString(i));
            long valueLong = Long.parseLong(o.toString());
            if (valueLong > 0) {
                return valueLong;
            }
        }
        return null;
    }
    /**
     * 获取某个玩家的座位
     *
     * @return 玩家id
     */
    public String obtainPlayerSeat(Long uid) {
        // 按key小到大排序
        for (int i = 1; i < 8; i++) {
            String string = Integer.toString(i);
            Object o = roomPos.get(string);
            long valueLong = Long.parseLong(o.toString());
            if (valueLong == uid) {
                return string;
            }
        }
        return null;
    }

    /**
     * 获取下个空座位
     *
     * @return 座位编号
     */
    public Integer obtainNextEmptySeat() {
        Integer pos = null;
        for (int i = 1; i < 8; i++) {
            Object o = roomPos.get(Integer.toString(i));
            long valueLong = Long.parseLong(o.toString());
            if (valueLong == 0) {
                pos = i;
                break;
            }
        }
        return pos;
    }

}

